package at.guigu.service.impl;

import at.guigu.domain.po.User;
import at.guigu.domain.query.PageQuery;
import at.guigu.domain.vo.PageVo;
import at.guigu.domain.vo.UserVo;
import at.guigu.mapper.UserMapper;
import at.guigu.service.IUserService;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.metadata.OrderItem;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;

import java.util.Collections;
import java.util.List;

/**
 * <p>
 * 用户表 服务实现类
 * </p>
 *
 * @author cgrs572
 * @since 2024-12-30
 */
/*@Service
// 未优化代码
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IUserService {
    @Override
    public PageVo<UserVo> queryUserByPage(PageQuery pageQuery) {
        // 1 构建分页条件
        Page<User> p = Page.of(pageQuery.getPageNo(), pageQuery.getPageSize());
        // 2 根据指定参数进行升序排列
        // 若获取的字符串不为null，且不为空则按照排序字段排序
        if (StrUtil.isNotBlank(pageQuery.getSortBy())) {
            // 若排序字段不为空，则按照排序字段排序
            if (pageQuery.getIsAsc()) p.addOrder(OrderItem.ascs(pageQuery.getSortBy()));
            else p.addOrder(OrderItem.descs(pageQuery.getSortBy()));
        } else {
            // 若排序字段为空，默认按照更新时间排序
            p.addOrder(OrderItem.desc("update_time"));
        }
        // 调用UserService中的page方法进行分页查询
        page(p);//等同于this.page(p);

        // 获取当前页的所有数据
        List<User> users = p.getRecords();
        // 若当前页无数据则返回空数据
        if (CollUtil.isEmpty(users)) return PageVo.of(p.getTotal(), p.getPages(), Collections.emptyList());
        // 当前页有数据则
        else {
            // 将集合List<User>转换为集合List<UserVo>
            List<UserVo> userVos = BeanUtil.copyToList(users, UserVo.class);
            // 封装返回数据
            return PageVo.of(p.getTotal(), p.getPages(), userVos);
        }
    }
}*/
/*// 优化一：
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IUserService {
    @Override
    public PageVo<UserVo> queryUserByPage(PageQuery pageQuery) {

        Page<User> p = pageQuery.toMpPage("update_time", false);
        // 调用UserService中的page方法进行分页查询
        page(p);//等同于this.page(p);

        // 获取当前页的所有数据
        List<User> users = p.getRecords();
        // 若当前页无数据则返回空数据
        if (CollUtil.isEmpty(users)) return PageVo.of(p.getTotal(), p.getPages(), Collections.emptyList());
            // 当前页有数据则
        else {
            // 将集合List<User>转换为集合List<UserVo>
            List<UserVo> userVos = BeanUtil.copyToList(users, UserVo.class);
            // 封装返回数据
            return PageVo.of(p.getTotal(), p.getPages(), userVos);
        }
    }
}*/
/*// 优化二：
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IUserService {
    @Override
    public PageVo<UserVo> queryUserByPage(PageQuery pageQuery) {

        Page<User> p = pageQuery.toMpPage("update_time", false);
        // 调用UserService中的page方法进行分页查询
        page(p);//等同于this.page(p);

        // 封装返回数据
        return new PageVo<>(p, UserVo.class);
    }*/
// 优化三：
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IUserService {
    @Override
    public PageVo<UserVo> queryUserByPage(PageQuery pageQuery) {

        Page<User> p = pageQuery.toMpPage("update_time", false);
        // 调用UserService中的page方法进行分页查询
        page(p);//等同于this.page(p);

        // 封装返回数据
        return new PageVo<>(p, user -> {
            UserVo vo = BeanUtil.copyProperties(user, UserVo.class);
            String username = vo.getUsername();
            // 名字长度为1或2时，直接将第二个字符设置为 "*"
            if (username.length() <= 2) {
                vo.setUsername(username.substring(0) + "*");
                //等同于vo.setUsername(username.charAt(0) + "*");
            } else {
            // 名字长度大于2时，将中间部分替换为 "*"
                String masked = username.charAt(0)
                                + "*".repeat(username.length() - 2)
                                +username.charAt(username.length() - 1);
                vo.setUsername(masked);
            }
            return vo;
        });
    }
}
